/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package imperio.eventos;

import imperio.Imperio;
import imperio.Sistema;
import imperio.controlador.Cap;
import imperio.population.Individuo;
import imperio.population.Populacao;
import imperio.simulador.Simulador;
import java.util.ArrayList;

/**
 *
 * @author Bernardo
 */
public class Reproducao extends Evento {

    public static float rho;

    public static float getRho() {
        return rho;
    }

    public static void setRho(float rho) {
        Reproducao.rho = rho;
    }
    
    /**Método construtor recebe um individuo como parâmetro e associa o evento de reprodução a esse indivíduo.

     * @param  individuo Individuo - Individuo no qual o evento de reprodução será associado.   

     */

    public Reproducao(Individuo individuo) {
        super(individuo);
        super.setTempo(Simulador.tempoCorrente +(1- Math.log(individuo.getConforto()))*rho);
    }

    /**Método de simulação do evento de reprodução, no qual um indivíduo é gerado cuja distribuição de sistemas planetários 
     * 
     * pelas patrulhas e igual a do progenitor a menos de [(1 - conforto(progenitor))*número de sistemas]sistemas. 
     * 
     * Esses sistemas retirados são posteriormente redistribuídos pelas patrulhas do novo indivíduo.
     * 
     * Após gerado o novo indivíduo são criados 3 novos eventos (reprodução, morte, mutação) para o novo individuo e 
     * 
     * 1 evento de reprodução para o individuo progenitor. Caso o número de individuos na população ultrapasse o limite
     * 
     * para a população máxima é adicionado o evento de epidemia an CAP.
     * 
     *        
     */
    
    @Override
    public void simularEvento() {
        Individuo individuo = new Individuo(super.getIndividuo());
        int sisRetirados = (int)((1 - super.getIndividuo().getConforto())* Imperio.getInstance().getSistemas().size());        
        ArrayList<Sistema> tempSistemas = new ArrayList<Sistema>(sisRetirados);

        for (int i = 0; i < sisRetirados; i++) {
            while (true) {
                int id = (int) (Math.random() * (individuo.getPatrulhas().size()));
                int rand = (int) (Math.random() * (individuo.getPatrulhas().get(id).getSistemasPatrulhados().size()));
                if (!individuo.getPatrulhas().get(id).getSistemasPatrulhados().isEmpty()) {
                    tempSistemas.add(individuo.getPatrulhas().get(id).getSistemasPatrulhados().remove(rand));
                    break;
                }
            }
        }
        for (int i = 0; i < sisRetirados; i++) {
            Sistema temp = tempSistemas.get(i);
            int id = (int) (Math.random()*individuo.getPatrulhas().size());
            individuo.getPatrulhas().get(id).getSistemasPatrulhados().add(temp);
        }
        individuo.recalConforto();        
        Populacao.individuos.add(individuo);
        if(Populacao.individuos.size() > Simulador.maxPop)
        Cap.adcionarEvCap(new Epidemia());
        Cap.adcionarEvCap(new Reproducao(super.getIndividuo()));
        Cap.adcionarEvCap(new Reproducao(individuo));
        Cap.adcionarEvCap(new Morte(individuo));
        Cap.adcionarEvCap(new Mutacao(individuo)); 
    }

}
